FROM python:3.11-slim as python-base
FROM node:19-slim as node-base

FROM python-base
COPY --from=node-base /usr/local /usr/local

ENV PATH="/usr/local/bin:${PATH}"
ENV PIPENV_VENV_IN_PROJECT=1
ENV XDG_CACHE_HOME=/pyls/.cache

RUN apt-get update \
    && apt-get install -y shellcheck wget \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && pip install pipenv

RUN npm install -g diagnostic-languageserver pyright

RUN set -eux; \
    arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \
    url=; \
    case "$arch" in \
    'amd64') \
    targz='go1.22.5.linux-amd64.tar.gz'; \
    ;; \
    'arm64') \
    targz='go1.22.5.linux-arm64.tar.gz'; \
    ;; \
    'armhf') \
    targz='go1.22.5.linux-armv6l.tar.gz'; \
    ;; \
    *) echo >&2 "error: unsupported architecture '$arch' (likely packaging update needed)"; exit 1 ;; \
    esac; \
    wget "https://golang.org/dl/$targz" -nv && tar -C /usr/local -xzf "$targz" && rm "$targz";

ENV PATH="${PATH}:/usr/local/go/bin"
ENV GOBIN=/usr/local/go/bin
RUN /usr/local/go/bin/go install -v golang.org/x/tools/gopls@latest

RUN pip3 install tornado python-lsp-jsonrpc ruff-lsp

COPY --from=denoland/deno:2.1.2 --chmod=755 /usr/bin/deno /usr/bin/deno

RUN mkdir -p /pyls/.cache

WORKDIR /pyls
COPY Pipfile .
RUN cat Pipfile
RUN pip install Cython
RUN pipenv install

COPY pyls_launcher.py .

RUN mkdir -p /tmp/monaco && chmod -R 777 /tmp/monaco
RUN cd /tmp/monaco && npm install --save-dev windmill-client

RUN chmod -R a+rX /usr/local && \
    chmod -R a+rX /pyls

EXPOSE 3001

CMD ["sh", "-c", "if [ -d /root/.cache ]; then export XDG_CACHE_HOME=/root/.cache && cp -r /pyls/.cache /root/.cache; fi && python3 pyls_launcher.py"]
